home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 52
/
Aminet 52 (2002)(GTI - Schatztruhe)[!][Dec 2002].iso
/
Aminet
/
misc
/
emu
/
Apex-src.lha
/
RAMDSKA2.68K
< prev
next >
Wrap
Text File
|
2001-09-30
|
7KB
|
238 lines
;RAMDSKA2.68K JUL-01-88 (ALSO SEE "INFOSTR")
;RAM DISK HANDLER FOR WRITE-PROTECTED KICKSTART RAM.
;
;REVISION HISTORY:
;
;INPUTS:
; NBLKS: NUMBER OF BLOCKS TO READ/WRITE
; FADDR: ADDRESS IN MEMORY TO WRITE/READ
; BLKNOX: BLOCK ON THE DISK TO START READ/WRITE
NOLIST
INCLUDE SYSPAG
LIST
UNTNUM EQU 2 ;UNIT NUMBER OF RAM DISK
SIZE EQU 1024 *256 ;MAX SIZE: 1024 BLOCKS
; (ALSO SEE "INFOSTR")
ALTRAM EQU $74200 ;BASE ADDRESS OF ALTERNATE RAM SPACE
; HOLDS 6 BLOCKS ($600 BYTES)
SCRBLK EQU 184 ;BLOCK WHERE SCRATCH.SYS APPEARS
BASE0 EQU $FBFE00 ;BASE ADDRESS OF RAM DISK SPACE
;THE BOOT BOOT (THE REAL BOOT IN REAL ROM) DOES NOT COPY THE TWO BLOCKS
; CONTAINING "KICK" INTO RAM, HENCE THE RAM DISK APPEARS TO START AT
; FBFE00 (= FC0000 - 200). THIS UNIT IS 1024 BLOCKS LONG, AND IT
; ACTUALLY CONTAINS BLOCKS 2-1025. IN PRACTICE ONLY BLOCKS 9-1023 ARE
; USED.
;
; DISK RAM CONTENTS
; 0 - KICK
; 1 - 0
; 2 FC0000 BOOT
; 3 FC0100 0
; 4-8 FC0200 UNUSED
; 9-12 FC0700 DIR
; 13-16 FC0B00 BACKUP DIR
; 17-1023 FC0F00 NORMAL FILE SPACE
; 1024 FFFE00 EXTRA BLOCK
; 1025 FFFF00 EXTRA BLOCK
;
;
;HANDY COMPARISON CHART:
; HEX BYTES MEGA BYTES BYTES BLOCKS
; $40000 1/4 262,144 1024
; $80000 1/2 524,288 2048
; $C0000 3/4 786,432 3072
; $100000 1 1,048,576 4096
ORG $7CE00 ;(END OF INTA)
START EQU @ ;ADDRESS WHERE THIS HANDLER STARTS
;-----------------------------------------------------------------------
;
RAMDSK DC.L OPEN ;0
DC.L OPEN ;1
DC.L READ ;2
DC.L WRITE ;3
DC.L DUMMY ;4
DC.L GETINFO ;5
DC.L DUMMY ;6 (SPARE)
DC.L DUMMY ;7 (SPARE)
;-----------------------------------------------------------------------
;INITIALIZE ALTERNATE MEMORY WITH A COPY OF THE RAM DISK. THE DIRECTORY
; IS COPIED FROM THE ACTUAL RAM DISK TO ALTERNATE RAM. SCRATCH.SYS IS
; ASSUMED TO BE INVALID UNLESS SOMETHING HAS BEEN WRITTEN TO IT SINCE
; BOOTING UP.
;
OPEN MOVEM.L D0-D7/A0-A6,-(SP) ;SAVE ALL REGISTERS
MOVEA.L #9*256 +BASE0,A6 ;BLOCK 9 = DIRECTORY
MOVEA.L A6,A5 ;A5:= MEMORY ADDRESS, THE REAL RAM DISK
MOVEQ #4,D0 ;D0:= NUMBER OF BLOCKS TO WRITE
MOVEQ #32,D2 ;USED FOR FAST INCREMENT
BSR DOWRITE
MOVEM.L (SP)+,D0-D7/A0-A6 ;RESTORE ALL REGISTERS
DUMMY RTS
;-----------------------------------------------------------------------
;READ BYTES FROM RAM DISK AND STORE THEM INTO MEMORY
;
READ MOVEM.L D0-D7/A0-A6,-(SP) ;SAVE ALL REGISTERS
BSR SETUP ;SET UP D0, D2, A5, AND A6
BRA.S RD70 ;ENTER LOOP CHECKING FOR ZERO BLOCKS
RD10 CMPA.L #[SCRBLK+1]*256+BASE0,A6 ;READING ABOVE SCRATCH.SYS?
BHI.S RD60 ;BRANCH IF SO -- DO NORMAL READ
MOVEA.L A6,A4 ;SET UP POINTER TO ALTERNATE RAM
CMPA.L #SCRBLK*256+BASE0,A6 ;READING SCRATCH.SYS?
BLO.S RD40 ;BRANCH IF NOT
ADDA.L #-[SCRBLK*256+BASE0] +ALTRAM +4*256, A4 ;ALT SCRATCH
BRA.S RD50 ;GO MOVE BLOCK FROM ALTERNATE RAM (A4)
RD40
CMPA.L #9*256+BASE0,A6 ;READING DIRECTORY?
BLO.S RD60 ;BRANCH IF NOT -- DO NORMAL READ
CMPA.L #12*256+BASE0,A6
BHI.S RD60 ;BRANCH IF NOT -- DO NORMAL READ
ADDA.L #-[9*256+BASE0] +ALTRAM, A4 ;POINT TO ALT DIRECTORY
;MOVE A 256-BYTE BLOCK FROM A4 TO A5, MOVE FROM ALTERNATE RAM TO MEMORY:
RD50 MOVEQ #7,D1 ;8 * 32 = 256 BYTES PER BLOCK
RD55 MOVEM.L (A4)+,A1-A3/D3-D7 ;READ 32 BYTES AT A4
MOVEM.L A1-A3/D3-D7,(A5) ;WRITE 32 BYTES AT A5
ADDA.L D2,A5 ;+32 (POST INCREMENTING IS NOT ALLOWED)
DBF D1,RD55 ;LOOP UNTIL ONE BLOCK IS MOVED
ADDA.L #256,A6 ;MOVE DISK POINTER TO NEXT BLOCK
BRA.S RD70 ;GO CHECK FOR NEXT BLOCK
;MOVE A 256-BYTE BLOCK FROM A6 TO A5, MOVE FROM DISK TO MEMORY:
RD60 MOVEQ #7,D1 ;8 * 32 = 256 BYTES PER BLOCK
RD65 MOVEM.L (A6)+,A1-A3/D3-D7 ;READ 32 BYTES AT A6
MOVEM.L A1-A3/D3-D7,(A5) ;WRITE 32 BYTES AT A5
ADDA.L D2,A5 ;+32 (POST INCREMENTING IS NOT ALLOWED)
DBF D1,RD65 ;LOOP UNTIL ONE BLOCK IS MOVED
RD70 DBF D0,RD10 ;DECREMENT BLOCK COUNT AND LOOP
MOVEM.L (SP)+,D0-D7/A0-A6 ;RESTORE ALL REGISTERS
RTS
;-----------------------------------------------------------------------
;WRITE BYTES FROM MEMORY ONTO THE RAM DISK.
;
WRITE MOVEM.L D0-D7/A0-A6,-(SP) ;SAVE ALL REGISTERS
BSR SETUP ;SET UP D0, D2, A5, AND A6
BSR DOWRITE
MOVEM.L (SP)+,D0-D7/A0-A6 ;RESTORE ALL REGISTERS
RTS
;-----------------------------------------------------------------------
;RETURN THE ADDRESS OF THE INFORMATION BLOCK IN D0.
;
GETINFO MOVE.L #INFO,D0
RTS
INFO DC.L START ;HANDLER START AND END ADDRESSES
DC.L END
DC.L INFOSTR
INFOSTR ASCII 'RAMDSKA2 JUL-01-88 Memory, 1024 blocks'
DC.B 0
;-----------------------------------------------------------------------
;SET UP REGISTERS.
; OUTPUTS:
; D0 = NUMBER OF BLOCKS
; D2 = 32
; A5 = MEMORY ADDRESS
; A6 = MEMORY ADDRESS ON RAM DISK
;
SETUP LEA BASE0.L,A6 ;A6:= BLKNOX * 256 + BASE
MOVE.L BLKNOX,D0 ; = MEMORY ADDRESS IN RAM DISK
ASL.L #8,D0
ADDA.L D0,A6
MOVEA.L FADDR,A5 ;A5:= MEMORY ADDRESS
MOVE.L NBLKS,D0 ;D0:= NBLKS
MOVEQ #32,D2 ;USED FOR FAST INCREMENT
RTS
;-----------------------------------------------------------------------
;WRITE BYTES FROM MEMORY ONTO THE RAM DISK
; INPUTS:
; D0 = NUMBER OF BLOCKS
; D2 = 32
; A5 = MEMORY ADDRESS
; A6 = MEMORY ADDRESS ON RAM DISK
; VIRTUALLY ALL REGISTERS ARE DISTROYED.
;
DOWRITE BRA.S WR70 ;ENTER LOOP CHECKING FOR ZERO BLOCKS
WR10 CMPA.L #[SCRBLK+1]*256+BASE0,A6 ;READING ABOVE SCRATCH.SYS?
BHI.S WR60 ;BRANCH IF SO -- DO NORMAL READ
MOVEA.L A6,A4 ;SET UP POINTER TO ALTERNATE RAM
CMPA.L #SCRBLK*256+BASE0,A6 ;READING SCRATCH.SYS?
BLO.S WR40 ;BRANCH IF NOT
ADDA.L #-[SCRBLK*256+BASE0] +ALTRAM +4*256, A4 ;PNT TO ALT SCRATCH
BRA.S WR50 ;GO MOVE BLOCK FROM ALTERNATE RAM (A4)
WR40
CMPA.L #9*256+BASE0,A6 ;READING DIRECTORY?
BLO.S WR60 ;BRANCH IF NOT -- DO NORMAL READ
CMPA.L #12*256+BASE0,A6
BHI.S WR60 ;BRANCH IF NOT -- DO NORMAL READ
ADDA.L #-[9*256+BASE0] +ALTRAM, A4 ;POINT TO ALT DIRECTORY
;MOVE A 256-BYTE BLOCK FROM A5 TO A4, MOVE FROM MEMORY TO ALTERNATE RAM:
WR50 MOVEQ #7,D1 ;8 * 32 = 256 BYTES PER BLOCK
WR55 MOVEM.L (A5)+,A1-A3/D3-D7 ;READ 32 BYTES AT A5
MOVEM.L A1-A3/D3-D7,(A4) ;WRITE 32 BYTES AT A4
ADDA.L D2,A4 ;+32 (POST INCREMENTING IS NOT ALLOWED)
DBF D1,WR55 ;LOOP UNTIL ONE BLOCK IS MOVED
ADDA.L #256,A6 ;MOVE DISK POINTER TO NEXT BLOCK
BRA.S WR70 ;GO CHECK FOR NEXT BLOCK
WR60 JSR VERROR ;CANNOT WRITE TO KICKSTART RAM
ASCII '0 - WRITE PROTECTED'
DC.B 0
BRA.S WR90 ;EXIT
WR70 DBF D0,WR10 ;DECREMENT BLOCK COUNT AND LOOP
WR90 RTS
IF @ > $7D000
ERROR -- FILE IS TOO LONG
ENDIF
END EQU @-1 ;ADDRESS OF END OF HANDLER
;======================================================================
;HOOK THIS HANDLER INTO THE UNIT-HANDLER TABLE
;
ORG 4 *UNTNUM +MAXTBL
DC.L SIZE /256
ORG 4 *UNTNUM +OFFTBL
DC.L 0
ORG 4 *UNTNUM +UNTTBL
DC.L RAMDSK
END
;
ORG 4 *UNTNUM +MAXTBL
DC.L SIZE /256
ORG 4 *UNTNUM +OFFTBL
DC.L 0
ORG